#pragma once
#ifndef _MyError_H_
#define _MyError_H_
#ifdef WIN32
#pragma execution_character_set("utf-8")
#endif // WIN32

#include <iostream>
#include <exception>
#include <QString>
#include <QMetatype>

using namespace std;
namespace MyErrorType {

	/// <summary>
	/// 定义错误代码-消息
	/// </summary>
	typedef struct ErrorType {

		int code;

		QString msg;

		ErrorType(int errorCode, const QString& errorMsg = "") : code(errorCode), msg(errorMsg) { }

	} ErrorType;

	//列举错误类型
	const ErrorType NONE_ERROR(0, "");
	const ErrorType UNKNOW_ERROR(-1, "未定义的异常，请联系开发人员");
	const ErrorType RUNTIME_EXCEPTION(-2, "系统异常");
	const ErrorType INIT_ERROR(-3, "系统初始化异常");

	const ErrorType CAMERA_ERROR(2000, "相机操作异常");
	const ErrorType CAMERA_NOT_FOUND(2001, "未发现相机列表");
	const ErrorType CAMERA_NOT_CONNECT(2002, "连接相机失败");
	const ErrorType CAMERA_LIVE_ERROR(2003, "启动相机采图失败");
	const ErrorType CAMERA_STOP_LIVE_ERROR(2004, "停止相机采图失败");
	const ErrorType GET_FRAME_FAIL(2005, "获取图像失败");
	const ErrorType CAMERA_ROI_SET_ERROR(2006, "相机ROI区域设置失败");
	const ErrorType CAMERA_SET_PARAMS_ERROR(2007, "设置相机参数失败");

	const ErrorType IMAGE_PROCESS_ERROR(3000, "图像处理异常");
	const ErrorType IMAGE_EMPTY(3001, "图像为空");
	const ErrorType INPUT_IMAGE_COUNT_LESS(3002, "输入图像少于预定值");

	const ErrorType SERIAL_ERROR(4000, "串口操作异常");
	const ErrorType SERIAL_OPEN_ERROR(4001, "打开串口失败");
	const ErrorType SERIAL_CLOSE_ERROR(4002, "关闭串口失败");
	const ErrorType SERIAL_READ_ERROR(4003, "串口读取数据失败");
	const ErrorType SERIAL_WRITE_ERROR(4004, "串口发送数据失败");
	const ErrorType SERIAL_LIST_EMPTY(4005, "未发现串口");
	const ErrorType SERIAL_CONNECT_ERROR(4006, "串口未连接");
	const ErrorType SERIAL_NAME_EMPTY(4007, "串口名称异常");
	const ErrorType SET_MOTO_PARAMS_ERROR(4008, "步进电机参数设置异常");
	const ErrorType INIT_MOTO_RUNMODEL_ERROR(4009, "初始化运动模式异常");
	const ErrorType MOTO_ENABLING_ERROR(4010, "步进电机使能异常");
	const ErrorType MOTO_DISABLING_ERROR(4011, "步进电机失能异常");
	const ErrorType SET_MOTO_SPEED_ERROR(4012, "设置步进电机速度异常");
	const ErrorType STOP_MOTO_ERROR(4013, "停止运动异常");
	const ErrorType GET_CAMERA_POSITION_ERROR(4014, "获取相机位置");
	const ErrorType MOVE_CAMERA_ERROR(4015, "相机移动异常");
	const ErrorType LED_SWITCH_ERROR(4016, "光源控制异常");

	const ErrorType DATABASE_ERROR(5000, "数据库操作异常");
	const ErrorType DATABASE_CONNECT_ERROR(5001, "数据库连接失败");
	const ErrorType DATABASE_INIT_ERROR(5002, "数据库初始化失败");
	const ErrorType DATABASE_INSERT_ERROR(5003, "插入数据失败");
	const ErrorType DATABASE_DELETE_ERROR(5004, "删除数据失败");
	const ErrorType DATABASE_UPDATE_ERROR(5005, "更新数据失败");
	const ErrorType DATABASE_QUERY_ERROR(5006, "查询数据失败");

	const ErrorType FILE_ERROR(6000, "文件操作失败");
	const ErrorType FILE_CREATE_ERROR(6001, "文件创建失败");
	const ErrorType FILE_DELETE_ERROR(6002, "文件删除失败");
	const ErrorType FILE_NOT_EXISTS(6003, "文件不存在");
	const ErrorType FILE_READ_ERROR(6004, "文件读取失败");
	const ErrorType FILE_WRITE_ERROR(6005, "文件保存失败");
}



///// <summary>
///// 自定义异常类
///// </summary>
class MyError : public exception {

public:

	/// <summary>
	/// 通过使用预定义的异常信息初始化异常对象
	/// </summary>
	/// <param name="error"></param>
	MyError(MyErrorType::ErrorType error = MyErrorType::NONE_ERROR);


	/// <summary>
	/// 赋值构造函数
	/// </summary>
	/// <param name="other"></param>
	MyError(const MyError& other);

	/// <summary>
	/// 重载 = 运算符
	/// </summary>
	/// <param name="other"></param>
	/// <returns></returns>
	MyError& operator=(const MyError& other);

	/// <summary>
	/// 获取异常类型
	/// </summary>
	/// <returns></returns>
	const QString& type() const;

	/// <summary>
	/// 返回错误代码
	/// </summary>
	/// <returns></returns>
	const int& code() const;

	/// <summary>
	/// 错误消息
	/// </summary>
	/// <returns></returns>
	const QString& desc() const;

	/// <summary>
	/// 返回错误的详细描述信息
	/// </summary>
	/// <returns></returns>
	const QString detail() const;


protected:

	// 错误代码
	int m_code;

	// 错误描述
	QString m_desc;
};

Q_DECLARE_METATYPE(MyError)

#endif


